#include <linux/init.h>
#include <linux/module.h>
#include <linux/kthread.h>
#include <linux/completion.h>
#include <linux/delay.h>

static struct completion my_completion;

// 线程函数
static int my_thread_fn(void *data)
{
    printk(KERN_INFO "Thread is running...\n");

    // 模拟一些工作
    msleep(5000);  // 等待 5 秒

    // 完成工作并退出线程
    complete_and_exit(&my_completion, 0);

    // 注意：complete_and_exit 之后的代码不会执行
    return 0;
}

static struct task_struct *my_thread;

static int __init my_module_init(void)
{
    // 初始化 completion 结构体
    init_completion(&my_completion);

    // 创建内核线程
    my_thread = kthread_create(my_thread_fn, NULL, "my_thread");
    if (IS_ERR(my_thread)) {
        printk(KERN_ERR "Failed to create kernel thread.\n");
        return PTR_ERR(my_thread);
    }

    // 启动线程
    wake_up_process(my_thread);

    // 等待线程完成
    wait_for_completion(&my_completion);

    printk(KERN_INFO "Kernel thread completed.\n");
    return 0;
}

static void __exit my_module_exit(void)
{
    printk(KERN_INFO "Module unloaded.\n");
}

module_init(my_module_init);
module_exit(my_module_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("A simple module to demonstrate complete_and_exit.");